package com.linktel.productionLine.dao;

import com.linktel.productionLine.EasyExcel.dailyAttendance.model.WriteDailyAttendance;
import com.linktel.productionLine.EasyExcel.dailyPlanning.model.WriteDailyPlanning;
import com.linktel.productionLine.entity.dto.dailyPlanning.DailyPlanningDTO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * @author Linktel
 * @description 针对表【daily_planning_capacity(日计划产能和排产)】的数据库操作Mapper
 * @Date 2023-08-30 12:32:32
 */
public interface DailyPlanningDao {
    /**
     * 根据productionLineCode，keyStepCode，planningDate查询日计划产能和排产信息id
     *
     * @param productionLineCode 产线id
     * @param keyStepCode        关键工序id
     * @param planningDate       计划时间
     * @return 询日计划产能和排产信息id
     */
    Long getCapacityAndSchedulingInfo(String productionLineCode,
                                      String keyStepCode,
                                      String planningDate,
                                      Long currentUserId);

    /**
     * 查询日计划产能和排产列表，根据请求参数筛选
     *
     * @param productionLineCode 产线编码
     * @param keyStepCode 关键工序编码
     * @param year 年
     * @param month 月
     * @return 日计划产能和排产列表列表
     */
    List<DailyPlanningDTO> listDailyPlanning(@Param("productionLineCode") String productionLineCode,
                                             @Param("keyStepCode") String keyStepCode,
                                             @Param("year") Integer year,
                                             @Param("month") Integer month);

    /**
     * 增加日规划产能数据
     *
     * @param productionLineCode 产线编码
     * @param keyStepCode        关键工序id
     * @param keyStepName        关键工序名称
     * @param planningDate       日期
     * @param targetRate         目标良率
     * @param currentUserId      当前用户
     * @param capacity           计划产能
     * @param scheduling         计划排产
     * @return 是否新增成功
     */
    Boolean addDailyPlanning(@Param("productionLineCode") String productionLineCode,
                             @Param("keyStepCode") String keyStepCode,
                             @Param("keyStepName") String keyStepName,
                             @Param("planningDate") LocalDate planningDate,
                             @Param("targetRate") Double targetRate,
                             @Param("capacity") Integer capacity,
                             @Param("scheduling") Integer scheduling,
                             @Param("currentUserId") Long currentUserId);

    /**
     * 修改日规划产能数据
     *
     * @param id 主键id
     * @param targetRate 目标良率
     * @param capacity 计划产能
     * @param scheduling 计划排产
     * @param currentUserId 当前登录用户id
     * @return 是否修改成功
     */
    Boolean editDailyPlanning(@Param("id") Long id,
                              @Param("targetRate") Double targetRate,
                              @Param("capacity") Integer capacity,
                              @Param("scheduling") Integer scheduling,
                              @Param("currentUserId") Long currentUserId);

    /**
     * 删除日规划产能数据
     *
     * @param id 主键id
     * @param currentUserId 当前登录用户id
     * @return 是否删除成功
     */
    Boolean deleteDailyPlanning(@Param("id") Long id,
                                @Param("currentUserId") Long currentUserId);

    /**
     * 删除月度计划，同时需要删除该月的日计划
     *
     * @param productionLineCode 产线编码
     * @param year               年
     * @param month              月
     * @param currentUserId      当前用户id
     */
    void deleteDailyPlanningByMonthlyPlanning(@Param("productionLineCode") String productionLineCode,
                                              @Param("year") Integer year,
                                              @Param("month") Integer month,
                                              @Param("keyStepCode") String keyStepCode,
                                              @Param("currentUserId") Long currentUserId);

    /**
     * 批量保存日计划产能和排产
     *
     * @param list 日计划产能和排产列表
     * @param currentUserId 当前登录用户id
     */
    void batchSave(List<WriteDailyPlanning> list, Long currentUserId);

    /**
     * 根据用户id删除日计划产能和排产
     *
     * @param commitUserId 删除用户id
     * @param currentUserId 当前登录用户id
     */
    void deleteDailyPlanningByUserId(Long commitUserId, Long currentUserId);

    /**
     * 删除用户和产线的关联关系，同时删除该用户和产线相关日计划产能和排产
     *
     * @param commitUserId 删除用户id
     * @param productionLineCode 产线编码
     * @param currentUserId 当前登录用户id
     */
    void deleteDailyPlanningByRelation(Long commitUserId, String productionLineCode, Long currentUserId);


    /**
     * 批量删除日计划产能
     *
     * @param list 日计划产能
     * @param currentUserId 当前登录用户id
     */
    void batchDelete(List<WriteDailyPlanning> list, Long currentUserId);

    void batchReplaceSave(List<WriteDailyPlanning> list, Long currentUserId);
}
